home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / QuickTime / Programming Stuff / Sample Code / Music Architecture / Mixed Bag / •Instrument Editor / Instrument Editor Filing.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  4.2 KB  |  251 lines  |  [TEXT/KAHL]

  1. /*
  2.  * file: Instrument Editor Filing.c
  3.  *
  4.  * started 12 January 1992 09:34
  5.  * david van brink
  6.  *
  7.  * The filing routines
  8.  *
  9.  */
  10.  
  11.  
  12. /*--------------------------
  13.     Inclusions
  14. --------------------------*/
  15.  
  16. #include <ImageCompression.h>
  17. #include <Resources.h>
  18. #include <Errors.h>
  19. #include <Memory.h>
  20.  
  21. #include "BigEasy2.h"
  22. #include "BigEasyDialogs.h"
  23. #include "BigEasyGrafish.h"
  24.  
  25. #include "Instrument Editor.h"
  26. #include "Instrument Editor Filing.h"
  27.  
  28. /*--------------------------
  29.     Local Prototypes
  30. --------------------------*/
  31.  
  32. static OSErr InternalSaveData(TDoc *d);
  33. static void DoIEPreview(TDoc *d,short resRefNum);
  34.  
  35. /*--------------------------
  36.     Wasabe
  37. --------------------------*/
  38.  
  39. void OpenDoc(short n,short item, short ref)
  40.     {
  41.     StandardFileReply sfr;
  42.     OSType ourType[5];
  43.     ourType[0] = kDocumentFileType;
  44.     StandardGetFilePreview(nil,1,ourType,&sfr);
  45.  
  46.     if(sfr.sfGood)
  47.         {
  48.         OpenDocSpec(&sfr.sfFile);
  49.         }
  50.     }
  51.  
  52.  
  53. void OpenDocSpec(FSSpec *fSpec)
  54.     {
  55.     short i;
  56.     short refNum;
  57.     register TDoc *d;
  58.     TSaveRecord **sr;
  59.     FInfo fileInfo;
  60.  
  61.     for(i = 0; i<kDocMax; i++)
  62.         {
  63.         d = &gDoc[i];
  64.         if(!d->used)
  65.             goto gotOne;
  66.         }
  67.  
  68.     EasyDialogMessage(0,(StringPtr)0x910,"\pNo more windows may be opened.",
  69.             kEasyDialogOkay);
  70.     goto goHome;
  71.  
  72. gotOne:
  73.     refNum = FSpOpenResFile(fSpec,fsRdPerm);
  74.     if(refNum == 1)
  75.         goto fileError;
  76.     sr = (void *)Get1IndResource(kDocumentResType,1);
  77.     if(!sr)
  78.         goto closeAndFileError;
  79.     HLock((void *)sr);
  80.     if((**sr).docVersion != kDocVersion)
  81.         {
  82.         EasyDialogMessage(0,fSpec->name,
  83.                 "\pThat was an old version of the file format.",
  84.                 kEasyDialogOkay);
  85.         goto closeAndFileError;
  86.         }
  87.  
  88.     d->used = true;
  89.     d->docSpec = *fSpec;
  90.     NewDocFromSaveRecord(i,&(**sr),0);
  91.     CloseResFile(refNum);
  92.  
  93.     goto goHome;
  94.  
  95. closeAndFileError:
  96.     CloseResFile(refNum);
  97. fileError:
  98.     EasyDialogMessage(0,fSpec->name,
  99.             "\pThere was a problem opening the file.",
  100.             kEasyDialogOkay);
  101.  
  102. goHome:;
  103.     }
  104.  
  105.  
  106.  
  107.  
  108.  
  109. short SaveDoc(short n,short item, short ref)    
  110. /*
  111.  * return nonzero to
  112.  * say it was cancelled.
  113.  */
  114.     {
  115.     TDoc *d;
  116.  
  117.     d = &gDoc[n - kFirstDocWindow];
  118.  
  119.     if(!d->everSaved)
  120.         return SaveAsDoc(n,item,ref);
  121.     else
  122.         return InternalSaveData(d);
  123.     }
  124.  
  125. short SaveAsDoc(short n,short item, short ref)
  126.     {
  127.     StandardFileReply sfr;
  128.     register TDoc *d;
  129.     Boolean result;
  130.     TSaveRecord *sr,**srH;
  131.     short refNum;
  132.     OSErr thisError;
  133.     OSType fileType;
  134.  
  135.     d = &gDoc[n - kFirstDocWindow];
  136.  
  137.     StandardPutFile("\p",d->docSpec.name,&sfr);
  138.  
  139.     result = !sfr.sfGood;
  140.     if(sfr.sfGood)
  141.         {
  142.         d->docSpec = sfr.sfFile;
  143.         SetWTitle(d->w,d->docSpec.name);
  144.         thisError = InternalSaveData(d);
  145.         }
  146.     else
  147.         thisError = 1;
  148.  
  149.     return thisError;
  150.     }
  151.  
  152.  
  153. OSErr InternalSaveData(TDoc *d)
  154.     {
  155.     TSaveRecord **srH,*sr;
  156.     short refNum;
  157.     OSErr thisError;
  158.     Rect r;
  159.     long i;
  160.  
  161.  
  162.     srH = (void *)NewHandle(sizeof(TSaveRecord));
  163.     HLock((void *)srH);
  164.     sr = *srH;
  165.  
  166.     sr->docVersion = kDocVersion;
  167.     SetPort(d->w);
  168.     sr->windowRect = qd.thePort->portRect;
  169.     LocalToGlobal((Point *)&sr->windowRect.top);
  170.     LocalToGlobal((Point *)&sr->windowRect.bottom);
  171.     sr->sr = d->sr;
  172.  
  173.     HUnlock((void *)srH);
  174.  
  175.     FSpCreateResFile(&d->docSpec,kCreatorFileType,kDocumentFileType,0);
  176.  
  177.     thisError = ResError();
  178.     if(thisError == dupFNErr)
  179.         thisError = 0;
  180.     if(thisError)
  181.         goto goHome;
  182.  
  183.     refNum = FSpOpenResFile(&d->docSpec,fsRdWrPerm); 
  184.  
  185.     if(refNum != -1)
  186.         {
  187.         Replace1Resource((void *)srH,kDocumentResType,10);
  188.  
  189.         for(i = 0; i < d->instrumentCount; i++)
  190.             Replace1Resource((Handle)d->instrument[i],kInstrumentListResType,i+1);
  191.  
  192.         d->changed = false;
  193.         d->littleChanged = false;
  194.         d->everSaved = true;
  195.         DoIEPreview(d,refNum);
  196.         CloseResFile(refNum);
  197.  
  198.         FixUpMenus(d);
  199.         }
  200.     else
  201.         thisError = -1;
  202.  
  203. goHome:
  204.     return thisError;
  205.     }
  206.  
  207.  
  208. #define kPreviewWidth 80
  209. #define kPreviewHeight 80
  210.  
  211. void DoIEPreview(TDoc *d,short resRefNum)
  212.     {
  213.     Rect r;
  214.     Point p;
  215.     PicHandle pH;
  216.     short i;
  217.  
  218.     r.left = r.top = 0;
  219.     r.right = kPreviewWidth;
  220.     r.bottom = kPreviewHeight;
  221.  
  222.     pH = OpenPicture(&r);
  223.     p.v = kTextAllowance;
  224.     p.h = 5;
  225.  
  226.     GoBW();
  227.     TextFont(3);
  228.     TextSize(9);
  229.     TextFace(0);
  230.  
  231.     MoveTo(p.h,p.v);
  232.     DrawChar('“');
  233.     DrawString(d->sr.synthName);
  234.     DrawChar('”');
  235.  
  236.     i = 0;
  237.     while(i < d->instrumentCount && p.v < kPreviewHeight-5)
  238.         {
  239.         p.v += kTextAllowance;
  240.         MoveTo(p.h,p.v);
  241.         DrawString((**d->instrument[i]).tone.instrumentName);
  242.         i++;
  243.         }
  244.  
  245.     ClosePicture();
  246.     AddFilePreview(resRefNum,'PICT',(Handle)pH);
  247.  
  248.     KillPicture(pH);
  249.     }
  250.  
  251.